package cn.tedu.order.tx;

import cn.tedu.order.entity.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/**
 * @author Amos
 * @date 2022/4/26
 * <p>
 * 1. 接口上添加注解： @LocalTCC
 * 2. 添加TCC三个方法，方法名任意
 * 必须返回boolean表示成功或失败
 * 3. 通过注解指定第一个T方法
 * 通过注解的参数，指定二阶段的两个C方法
 * @TwoPhaseBusinessAction(commitMethod="方法名", rollbackMethod="方法名")
 * 4. 三个方法上添加参数： BusinessActionContext
 * 用来在两个阶段之间传递参数
 * 5. 第一阶段方法，添加业务数据参数，用来冻结数据
 * 6. 通过注解，把业务数据参数，放入上下文对象，向第二阶段传递
 * @BusinessActionContextParameter
 *
 * 为了避开seata的一个bug，这里不传递封装的订单对象，
 * 而是把数据打散，一个个单摆浮搁的传递
 */

@LocalTCC
public interface OrderTccAction {
    @TwoPhaseBusinessAction(name = "OrderTccAction", commitMethod = "commit", rollbackMethod = "rollback")
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId")
                    Long orderId,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);

    boolean commit(BusinessActionContext ctx);

    boolean rollback(BusinessActionContext ctx);
}
